; void crear_lista_huffman(unsigned int *tabla_apariciones, nodo_lista_t **l, nodo_arbol_t **indices_nodos_simbolos);

%include "macros/personalizada.mac"
%include "macros/nodo_arbol_t.mac"
%include "macros/nodo_lista_t.mac"

extern lista_insertar_ordenado
extern calloc

%define ptr_nodo_lista [ebp - 4]
%define ptr_tabla_apariciones [ebp + 8]
%define ptr_ptr_lista [ebp + 12]
%define ptr_ptr_indices [ebp + 16]

global crear_lista_huffman

section .text

crear_lista_huffman:
	push ebp
	mov ebp, esp
	sub esp, 4
	push esi
	push edi
	push ebx
	
	mov esi, ptr_tabla_apariciones
	cmp esi, 0
	jne sigo
	jmp fin
sigo:
	
	mov edi, ptr_ptr_indices ; edi = Puntero a la tabla de 256 posiciones.
	
	mov ecx, 256 ; ecx = Cantidad de iteraciones.
	
ciclo:
	push ecx
	mov ebx, ecx
	dec ebx ; ebx = Simbolo.
	
	; Nos fijamos si cantidad de apariciones es 0.
	mov ecx, [esi + ebx * 4] ; Pongo en ecx la cantidad de apariciones del simbolo.
	cmp ecx, 0
	je el_siguiente
	
por_fin:
	; Creamos el nodo arbol (en eax = ptr al nodo arbol nuevo).
	mov ecx, 21
	mov eax, 1
	push ecx
	push eax
	call calloc
	add esp, 8
	cmp eax, 0
	je fin
	
	push eax
	
	; Creamos el nodo lista (en eax = ptr al nodo lista nuevo).
	mov ecx, 8
	mov eax, 1
	push ecx
	push eax
	call calloc
	add esp, 8
	cmp eax, 0
	je fin
	
	pop ecx ; En eax = ptr al nodo lista y en ecx = ptr al nodo arbol.
	mov [eax + off_ptr_nodo_arbol_t_nl], ecx ; Seteo el ptr a nodo.
	mov dword [eax + off_ptr_sig_nl], 0
	mov ptr_nodo_lista, eax ; Guardamos el ptr al nodo lista en ptr_nodo_lista.
	
	mov eax, ecx ; eax = ptr al nodo arbol.
	mov [eax + off_simbolo_na], bl ; Guardamos el simbolo en el nodo arbol.
	mov ecx, [esi + ebx * 4] ; ecx = la cantidad de apariciones en la posicion actual de la tabla de apariciones.
	mov [eax + off_apariciones_na], ecx ; Guardamos la cantidad de apariciones en el nodo arbol.
	mov dword [eax + off_valido_na], valido ; Guardamos validez.
	; Como usamos calloc padre, izq y der vienen en 0.
	
	mov [edi + ebx * 4], eax ; Guardamos en la tabla de 256 posiciones el puntero al nodo creado.
	
	; Insertamos el nodo a la lista.
	; void lista_insertar_ordenado(nodo_lista_t **l, nodo_lista_t *n);
	mov eax, ptr_nodo_lista
	mov ecx, ptr_ptr_lista
	push eax
	push ecx
	call lista_insertar_ordenado
	add esp, 8
	
el_siguiente:
	
	pop ecx
	dec ecx
	cmp ecx,0
	je fin
	jmp ciclo
	
fin:
	pop ebx
	pop edi
	pop esi
	add esp,4
	pop ebp
	ret
